পয়েন্টার হল একটি ভেরিয়েবল যার মান কোনো অন্য ভেরিয়েবলের মেমরি ঠিকানা। সি প্রোগ্রামিং ভাষায় পয়েন্টার একটি গুরুত্বপূর্ণ কনসেপ্ট, যা মেমরি ম্যানেজমেন্ট এবং ডেটা অ্যাক্সেস করার জন্য ব্যবহৃত হয়। পয়েন্টারের মাধ্যমে আপনি এক্সটারনাল ডেটা স্ট্রাকচার অ্যাক্সেস করতে পারেন এবং মেমরি ব্লক নিয়ন্ত্রণ করতে পারেন, যা সি প্রোগ্রামিংয়ের অন্যতম শক্তি।
&
): &
অপারেটর ব্যবহার করে কোনো ভেরিয়েবলের মেমরি ঠিকানা পাওয়া যায়।*
): *
অপারেটর পয়েন্টারের মাধ্যমে মূল ভেরিয়েবলের মান অ্যাক্সেস করতে ব্যবহৃত হয়।*
চিহ্নের সাহায্যে, যেখানে *
চিহ্ন জানিয়ে দেয় যে এটি একটি পয়েন্টার ভেরিয়েবল।#include <stdio.h>
int main() {
int num = 10;
int *ptr; // Pointer declaration
ptr = # // Pointer points to the address of num
printf("Value of num: %d\n", num); // Direct access to the value
printf("Address of num: %p\n", &num); // Address of num
printf("Pointer ptr points to address: %p\n", ptr); // Pointer holds the address of num
printf("Value pointed to by ptr: %d\n", *ptr); // Dereferencing the pointer to access value
return 0;
}
ব্যাখ্যা:
int *ptr;
: এটি একটি পয়েন্টার ভেরিয়েবল ptr
ডিক্লেয়ার করেছে যা int
টাইপের ভেরিয়েবলের মেমরি ঠিকানা ধারণ করবে।ptr = #
: এখানে ptr
পয়েন্টারটি num
ভেরিয়েবলের মেমরি ঠিকানা ধারণ করছে।*ptr
: এটি ptr
পয়েন্টারের মাধ্যমে num
এর মান অ্যাক্সেস করবে। এটি ডেরিফারেন্স অপারেটর।আউটপুট:
Value of num: 10
Address of num: 0x7ffd9b4e2f8c
Pointer ptr points to address: 0x7ffd9b4e2f8c
Value pointed to by ptr: 10
#include <stdio.h>
int main() {
int arr[] = {10, 20, 30, 40, 50};
int *ptr;
ptr = arr; // Pointer points to the first element of the array
// Accessing array elements using pointer
for (int i = 0; i < 5; i++) {
printf("Element %d: %d\n", i, *(ptr + i)); // Dereferencing the pointer
}
return 0;
}
ব্যাখ্যা:
ptr = arr;
: এখানে ptr
পয়েন্টারটি অ্যারের প্রথম উপাদানকে পয়েন্ট করছে।*(ptr + i)
: পয়েন্টারকে অ্যারের প্রতিটি উপাদানে ইনডেক্স করে অ্যাক্সেস করা হচ্ছে। এটি পয়েন্টারের মাধ্যমে অ্যারে উপাদান অ্যাক্সেস করতে সহায়তা করে।আউটপুট:
Element 0: 10
Element 1: 20
Element 2: 30
Element 3: 40
Element 4: 50
#include <stdio.h>
// Function to swap values using pointers
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 5, y = 10;
printf("Before swapping: x = %d, y = %d\n", x, y);
// Calling swap function with pointers
swap(&x, &y);
printf("After swapping: x = %d, y = %d\n", x, y);
return 0;
}
ব্যাখ্যা:
swap
ফাংশনে int *a
এবং int *b
পয়েন্টার ব্যবহার করা হয়েছে।&x
এবং &y
দ্বারা মান পাস করা হচ্ছে যাতে মূল ভেরিয়েবলগুলির মান সরাসরি পরিবর্তন করা যায়।x
এবং y
এর মান একে অপরের সাথে পরিবর্তিত হয়।আউটপুট:
Before swapping: x = 5, y = 10
After swapping: x = 10, y = 5
সি প্রোগ্রামে ডায়নামিক মেমরি ব্যবহারের জন্য malloc(), calloc(), realloc(), এবং free() ফাংশন ব্যবহৃত হয়।
ডায়নামিক মেমরি এক্সাম্পল:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
int n = 5;
// Dynamically allocate memory for 5 integers
ptr = (int*)malloc(n * sizeof(int));
// Check if memory is allocated
if (ptr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
// Assign values to dynamically allocated memory
for (int i = 0; i < n; i++) {
ptr[i] = (i + 1) * 10;
}
// Print the values
for (int i = 0; i < n; i++) {
printf("Element %d: %d\n", i, ptr[i]);
}
// Free dynamically allocated memory
free(ptr);
return 0;
}
ব্যাখ্যা:
malloc(n * sizeof(int))
: এটি n
সংখ্যক int
ভেরিয়েবল জন্য মেমরি অ্যাক্সেস দেয়।free(ptr)
: ডায়নামিক মেমরি মুক্ত করার জন্য ব্যবহৃত হয়।আউটপুট:
Element 0: 10
Element 1: 20
Element 2: 30
Element 3: 40
Element 4: 50
int *ptr;
: এটি একটি পয়েন্টার ডিক্লেয়ারেশন যা int
টাইপের মানের মেমরি ঠিকানা ধারণ করবে।&
):&num
: এটি num
ভেরিয়েবলের মেমরি ঠিকানা প্রদান করে।*
):*ptr
: এটি পয়েন্টার ptr
এর মাধ্যমে মেমরি ঠিকানায় সংরক্ষিত ভেরিয়েবলের মান অ্যাক্সেস করে।সি পয়েন্টার একটি শক্তিশালী এবং মৌলিক কনসেপ্ট যা মেমরি অ্যাক্সেস এবং ম্যানেজমেন্টে ব্যবহৃত হয়। এটি একাধিক ভেরিয়েবলকে একত্রিত করতে, ডায়নামিক মেমরি ব্যবস্থাপনা করতে এবং এক্সটারনাল ডেটা স্ট্রাকচার অ্যাক্সেস করতে সহায়তা করে। সঠিকভাবে পয়েন্টার ব্যবহার করলে, আপনি দ্রুত এবং কার্যকরী প্রোগ্রাম তৈরি করতে পারেন, তবে পয়েন্টার ব্যবহারে সঠিক মনোযোগ এবং সাবধানতা প্রয়োজন।
এই অধ্যায়ে আপনি সি প্রোগ্রামিং পয়েন্টার সম্মন্ধে জানবেন; পয়েন্টার কি, পয়েন্টার কিভাবে ব্যবহার করবেন এবং পয়েন্টার নিয়ে কাজ করার সময় সাধারণ ভুলের জন্য যে সকল সমস্যার সম্মুখীন হবেন।
সি এবং সি++ প্রোগ্রামিং এর শক্তিশালী বৈশিষ্ট্য হলো পয়েন্টার(Pointer) যার মাধ্যমে ইহা অন্যান্য জনপ্রিয় প্রোগ্রামিং ল্যাঙ্গুয়েজ যেমন- পাইথন এবং জাভা থেকে বেশী প্রাধান্য পায়।
মেমোরি এক্সেস(access) করার জন্য এবং মেমোরি এড্রেস নিপুণভাবে পরিচালনা করার জন্য সি প্রোগ্রামিং এ পয়েন্টার ব্যবহৃত হয়।
পয়েন্টারের ধারণা নেওয়ার পূর্বে চলুন সি প্রোগ্রামিং এড্রেসের সাথে পরিচিত হয়ে নিই।
আপনার প্রোগ্রামে যদি count একটি ভ্যারিয়েবল থাকে তাহলে &count
আপনাকে মেমোরির এড্রেস দিবে। এখানে &
কে রেফারেন্স অপারেটর বলা হয়।
আপনি যখন scanf()
ফাংশন ব্যবহার করবেন তখন অবশ্যই এই প্রতীকটি দেখবেন। ইউজার কর্তৃক ইনপুট ভ্যালু ভারিয়েবলের এড্রেসে জমা(store) করার জন্য ইহা ব্যবহৃত হয়।
scanf("%d",&count);
kt_satt_skill_example_id=470
নোটঃ এই একই কোড ব্যবহার করে আপনি এড্রেসের বিভিন্ন ভ্যালু পেতে পারেন।
উপরের সোর্স কোডে ভ্যালু 5 মেমোরির 2686778 লোকেশনে জমা হয়। count শুধুমাত্র সেই লোকেশন(location) এর নাম।
সি প্রোগ্রামিং এ এক ধরণের বিশেষ ভ্যারিয়েবল রয়েছে যা অন্য ভ্যারিয়েবলের এড্রেস জমা(store) রাখে। ইহাকে পয়েন্টার ভ্যারিয়েবল বা শুধু পয়েন্টার বলা হয়।
data_type* pointer_variable_name;
int* p;
উপরের স্টেটমেন্টে p কে int
টাইপের পয়েন্টার ভ্যারিয়েবল হিসাবে ডিক্লেয়ার(declare) করা হয়েছে।
ইতোপূর্বেই বর্ণনা করা হয়েছে যে, & কে রেফারেন্স(reference) অপারেটর বলা হয়। ইহার মাধ্যমে আপনি ভ্যারিয়েবলের এড্রেস পাবেন।
অনুরূপভাবে, অন্য একটি অপারেটর রয়েছে যার মাধ্যমে আপনি এড্রেস থেকে ভ্যালু পেতে পারেন। ইহাকে ডিরেফারেন্স(*) অপারেটর বলা হয়।
নিচের উদাহরণে পয়েন্টার, রেফারেন্স(reference) অপারেটর এবং ডিরেফারেন্স(dereference) অপারেটরের ব্যবহার স্পষ্টভাবে ব্যাখ্যা করা হয়েছে।
নোটঃ: পয়েন্টার ডিক্লেয়ারেশন(declaration) এ ব্যবহৃত *
চিহ্ন ডিরেফারেন্স অপারেটর নয়। ইহা পয়েন্টার নির্দেশের জন্য শুধুমাত্র একটি প্রতীক।
kt_satt_skill_example_id=468
int* pc;
পয়েন্টার ভ্যারিয়েবল pc তৈরি করে এবংint c;
সাধারণ ভ্যারিয়েবল c তৈরি করে।
যেহেতু pc এবং c উভয়কেই ইনিশিয়ালাইজ(initialized) করা হয়নি, সুতরাং পয়েন্টার pc এড্রেস বা র্যান্ডম(random) এড্রেস কোনো কিছুকেই নির্দেশ করে না। একইভাবে ভ্যারিয়েবল c এর এড্রেস এসাইন(assigned) করা হয়ছে কিন্তু ইহা random/garbage ভ্যালু ধারণ করে।c=22;
ভ্যারিয়েবল c এ 22 এসাইন(assign) করে অর্থাৎ 22 ভ্যারিয়েবল c এর মেমোরি লোকেশনে জমা(store) করে।
মনে রাখবেন, c(ভ্যারিয়েবল) এর এড্রেস(&c
) প্রিন্ট করার সময় আমরা%d
এর পরিবর্তে%u
ব্যবহার করবো যেহেতু এড্রেস সবসময় ধনাত্মক(unsigned integer) হয়।pc=&c;
ভ্যারিয়েবল c এর এড্রেসকে পয়েন্টার pc তে এসাইন করে।
যখন প্রিন্ট করা হয় তখন দেখবেন পয়েন্টার pc এর এড্রেস এবং c এর এড্রেস একই হবে। এছাড়া পয়েন্টার pc এর কন্টেটও একই(22) হবে।c=11;
ভ্যারিয়েবল c এ 11 এসাইন করে।
আমরা ভ্যারিয়েবল c এ নতুন ভ্যালু এসাইন করলাম যা পয়েন্টার pc কে প্রভাবিত করে।- যেহেতু পয়েন্টার pc এবং c একই এড্রেসকে নির্দেশ করে, সুতরাং পয়েন্টার pc একই ভ্যালু 11 কেই রেফার করে।
pc এর এড্রেস এবং কন্টেন্ট প্রিন্ট করলে আপডেট ভ্যালু 11 প্রদর্শিত হয়।*pc=2;
পয়েন্টার pc দ্বারা নির্দেশিত মেমোরি লোকেশনের পূর্বের কন্টেন্ট পরিবর্তন করে 2 এসাইন করে।
যেহেতু পয়েন্টার pc এবং ভ্যারিয়েবল c একই এড্রেসকে নির্দেশ করে সুতরাং c এর ভ্যালু পরিবর্তন হয়ে 2 হয়।
ধরুন, আপনি পয়েন্টার pc কে c এর এড্রেসে পয়েন্ট/নির্দেশ করতে চাচ্ছেন। তাহলে
int c, *pc;
pc=c; /* ভুল! যেখানে pc হলো এড্রেস অথচ c এড্রেস নয়। */
*pc=&c; /* ভুল! যেখানে *pc হলো এড্রেসের নির্দেশকৃত ভ্যালু অথচ &c হলো এড্রেস। */
pc=&c; /* Correct! যেহেতু pc এবং &c উভয়ই এড্রেস। */
*pc=c; /* সঠিক! যেহেতু *pc হলো এড্রেসের নির্দেশকৃত ভ্যালু এবং c ও ভ্যালু। */
উভয় ক্ষেত্রেই পয়েন্টার pc, c এর এড্রেসকে নির্দেশ করে না।
এই অধ্যায়ে আপনি array এবং pointer এর সম্পর্ক সম্মন্ধে জানবেন এবং আপনি আপনার প্রোগ্রামে সঠিকভাবে এদেরকে ব্যবহার করা শিখবেন।
সি প্রোগ্রমিং এ array এবং pointer প্রায় একই রকম। কিন্তু এদের মধ্যে গুরুত্বপূর্ণ পার্থক্য হলো পয়েন্টারের ভ্যালু হিসাবে বিভিন্ন এড্রেস থাকতে পারে পক্ষান্তরে array এর এড্রেস ফিক্সড(fixed) থাকে।
নিচের উদাহরণের সাহায্যে এদের মধ্যে পার্থক্য দেখানো হলোঃ
kt_satt_skill_example_id=476
নোটঃ আপনি array এর বিভিন্ন এড্রেস পেতে পারেন।
উপরের উদাহরণের ফলাফলে লক্ষ্য করলে দেখবেন যে, charArr অ্যারে এর পরস্পর দুটি এলিমেন্টের পার্থক্য সমান। অর্থাৎ এদের পার্থক্য হলো ১ বাইট।
কিন্তু পয়েন্টার যেহেতু অন্য ভ্যারিয়েবলের লোকেশনকে নির্দেশ করে, সুতরাং ইহা যেকোনো এড্রেস জমা(store) করতে পারে।
নিচের ন্যায় একটি array বিবেচনা করুনঃ
int arr[4];
সি প্রোগ্রামিং এ array এর নাম সবসময় array এর প্রথম এলিমেন্টের এড্রেসকে নির্দেশ করে।
উপরের প্রোগ্রামে arr এবং &arr[0] উভয়ই প্রথম এলিমেন্টের এড্রেসকে নির্দেশ(point) করে।
&arr[0] সাধারণত arr এর সমান
যেহেতু উভয়ের এড্রেস একই, সুতরাং arr এবং &arr[0] এর ভ্যালুও একই।
arr[0] সাধারণত *arr(পয়েন্টারের এড্রেসের ভ্যালু) এর সমান।
একইভাবে,
&arr[1] সাধারণত (arr + 1) এর সমান এবং arr[1] সাধারণত *(arr + 1) এর সমান।
&arr[2] সাধারণত (arr + 2) এর সমান এবং arr[2] সাধারণত *(arr + 2) এর সমান।
&arr[3] সাধারণত (arr + 1)এর সমান এবং arr[3] সাধারণত *(arr + 3) এর সমান।
.
.
&arr[i] সাধারণত (arr + i) এর সমান এবং arr[i] সাধারণত *(arr + i) এর সমান।
সি প্রোগ্রামিং এ আপনি array ডিক্লেয়ার(declare) করতে পারেন এবং পয়েন্টার ব্যবহার করে এই array এর ডেটা(data) পরিবর্তন করতে পারেন।
kt_satt_skill_example_id=478
ই অধ্যায়ে আপনি পয়েন্টারকে ফাংশনের আর্গুমেন্ট(argument) হিসাবে অতিক্রম(pass) করানো শিখবেন। এছাড়া আপনার প্রোগ্রামে সঠিকভবে পয়েন্টার ব্যবহার করা শিখবেন।
ফাংশন এর মধ্যে দিয়ে pointer কে যখন আর্গুমেন্ট হিসাবে অতিক্রম করানো হয় তখন ভ্যালুর পরিবর্তে মেমোরি লোকেশনের এড্রেস অতিক্রম হয়।
কারণ সি প্রোগ্রামিং এ পয়েন্টার ভ্যালু জমা রাখার পরিবর্তে মেমোরির লোকেশনকে ভ্যালু হিসাবে জমা(store) রাখে।
রেফারেন্স(reference) দ্বারা ফাংশন কল করে দুটি সংখ্যাকে বিনিময়(swap) করার জন্য সি প্রোগ্রাম
kt_satt_skill_example_id=486
উপরের উদাহরণের ব্যাখ্যাঃ
- num1 এবং num2 ভ্যারিয়েবলের মেমোরি লোকেশনের এড্রেসকে swap() ফাংশনের মধ্যে দিয়ে অতিক্রম করানো হয়। পয়েন্টার *n1 এবং *n2 ঐ এড্রেস-সমূহকে ভ্যালু হিসাবে গ্রহণ করে।
- সুতরাং এখন পয়েন্টার n1 এবং n2 যথাক্রমে num1 এবং num2 এর এড্রেসকে নির্দেশ(point) করে।
- পয়েন্টারের ভ্যালু যখন পরিবর্তন হয় তখন মেমোরি লোকেশনে নির্দেশিত(pointed) ভ্যালুও যথাক্রমে পরিবর্তন হয়।
- সুতরাং পয়েন্টার
*n1
এবং*n2
তে পরিবর্তন ঘটলেmain()
ফাংশনের num1 এবং num2 তেও পরিবর্তন ঘটে।
এই কৌশলকে সি প্রোগ্রামিং এ রেফারেন্স কর্তৃক(Call by Reference) কল করা বলা হয়।
এই অধ্যায়ে আপনি স্টান্ডার্ড লাইব্রেরী ফাংশন malloc(), calloc(), free() এবং realloc() ব্যবহার করে আপনার প্রোগ্রামে ডাইনামিকভাবে মেমোরি বরাদ্দ(dynamically allocate memory) করা শিখবেন।
সি প্রোগ্রামিং এ, কম্পাইল টাইমে না যাওয়া পর্যন্ত array এর সাইজ অজানা থাকে। অর্থাৎ ঐ সময় পর্যন্ত যতক্ষণ না কম্পাইলার আপনার কোডকে কম্পিউটার বুঝে এমন কোডে এ(language ) রূপান্তর করে। সুতরাং মাঝে মাঝে array এর সাইজ(size) কম অথবা প্রয়োজনের তুলনায় বেশিও হতে পারে।
ডাইনামিক মেমোরি এ লোকেশন(Dynamic memory allocation) আপনার প্রোগ্রাম রান(run) করার সময় হয় অধিক মেমোরি ধরে রাখে অথবা প্রয়োজন না হলে ছেড়ে দেয়।
সহজ অর্থে, ডাইনামিক মেমোরি এলোকেশন আপনার প্রোগ্রামের মেমোরি স্পেস মায়লুয়ালি(manually) পরিচালনা করার সম্মতি দেয়।
সি প্রোগ্রামে উত্তরাধিকার সূত্রে মেমোরি বরাদ্দের জন্য ডাইনামিক কোনো কৌশল না থাকলেও হেডার ফাইল "stdlib.h"
এর অধীনে ডাইনামিকভাবে মেমোরি এলোকেশন এর জন্য ৪টি লাইব্রেরী ফাংশন রয়েছে।
ফাংশন | ফাংশনের ব্যবহার |
---|---|
malloc() | অনুরোধের ভিত্তিতে মেমোরি স্পেস বরাদ্দ করে এবং বরাদ্দ করা মেমোরির প্রথম বাইটের জন্য পয়েন্টার রিটার্ন করে। |
calloc() | Array এর এলিমেন্টের জন্য মেমোরি স্পেস বরাদ্দ করে এবং এর প্রাথমিক ভ্যালু 0(শূন্য) থাকে। তারপরে মেমোরিতে পয়েন্টার রিটার্ন করে। |
free() | পূর্বের বরাদ্দ করা মেমোরি স্পেস মুক্ত/খালি করে। |
realloc() | পূর্বের বরাদ্দ করা মেমোরি স্পেসের পরিবর্তন ঘটায়। |
malloc এর পূর্ণরূপ "memory allocation"।
malloc()
ফাংশন মেমোরির একটি নির্দিষ্ট জাইগা(bolck) দখল করে এবং void
টাইপের pointer রিটার্ন করে যার মাধ্যমে যেকোনো আকৃতির(from) পয়েন্টার নিক্ষেপ(cast) হতে পারে।
ptr = (cast-type*) malloc(byte-size)
এখানে ptr হলো নিক্ষেপ(cast) টাইপের পয়েন্টার। malloc()
ফাংশন মেমোরির মধ্যে বাইট এককে নির্দিষ্ট সাইজের একটি পয়েন্টার রিটার্ন করে। মেমোরি স্পেস পর্যাপ্ত না হোলে NULL পয়েন্টার রিটার্ন(return) করে।
ptr = (int*) malloc(50 * sizeof(int));
এই স্টেটমেন্টটি int
এর সাইজ(২ অথবা ৪ বাইট) এর উপর ভীতিকরে যথাক্রমে ১০০ অথবা ২০০ বাইট মেমোরি বরাদ্দ করতে পারে এবং পয়েন্টার মেমোরির প্রথম বাইটের এড্রেসে রেফার(point) করে।
calloc এর পূর্ণরুপ "contiguous allocation"।
malloc() এবং calloc() এর মধ্যে শুধুমাত্র পার্থক্য হলো malloc() ফাংশন মেমোরির সিঙ্গেল ব্লক(single block of memory) বরাদ্দ করে পক্ষান্তরে calloc() ফাংশন মেমোরির মাল্টিপল ব্লক(multiple blocks of memory) বরাদ্দ করে এবং প্রত্যেকের সাইজ সেট হয় 0(শূন্য)।
ptr = (cast-type*)calloc(n, element-size);
এই স্টেটমেন্টটি n সংখ্যক এলিমেন্ট বিশিষ্ট array জন্য সন্নিহিত(contiguous) মেমোরি স্পেস বরাদ্দ করবে।
উদাহরণস্বরূপঃ
ptr = (float*) calloc(50, sizeof(double));
এই স্টেটমেন্টটি ৫০টি এলিমেন্ট বিশিষ্ট array জন্য double(8 bytes) সাইজের সন্নিহিত(contiguous) মেমোরি স্পেস বরাদ্দ করবে।
calloc() অথবা malloc() ফাংশন কর্তৃক ডাইনামিকভাবে(Dynamically) বরাদ্দ হওয়া মেমোরি নিজে নিজে মুক্ত হতে পারে না। তাই আটককৃত(allocated) মেমোরি খালাস(release) করার জন্য আপনাকে অবশ্যই free() ফাংশন ব্যবহার করতে হবে।
free(ptr);
এই স্টেটমেন্টটি পয়েন্টার(ptr) কর্তৃক মেমোরিতে বরাদ্দ হওয়া স্পেসকে খালি করে।
ইউজার কর্তৃক ইনপুট নিয়ে n সংখ্যক এলিমেন্টের যোগফল নির্ণয়ের জন্য সি প্রোগ্রাম লিখুন।
এই প্রোগ্রামটি সম্পাদনের জন্য malloc() ফাংশন ব্যবহার করে ডাইনামিকভাবে মেমোরি বরাদ্দ(allocate) করতে হবে।
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num, i, *ptr, sum = 0;
printf("Enter number of elements: ");
scanf("%d", &num);
ptr = (int*) malloc(num * sizeof(int)); //malloc ব্যবহার করে মেমোরি বরাদ্দ করা
if(ptr == NULL)
{
printf("Error! memory not allocated.");
exit(0);
}
printf("Enter elements of array: ");
for(i = 0; i < num; ++i)
{
scanf("%d", ptr + i);
sum += *(ptr + i);
}
printf("Sum = %d", sum);
free(ptr);
return 0;
}
ইউজার কর্তৃক ইনপুট নিয়ে n সংখ্যক এলিমেন্টের যোগফল নির্ণয়ের জন্য সি প্রোগ্রাম লিখুন।
এই প্রোগ্রামটি সম্পাদনের জন্য calloc() ফাংশন ব্যবহার করে ডাইনামিকভাবে মেমোরি বরাদ্দ(allocate) করতে হবে।
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num, i, *ptr, sum = 0;
printf("Enter number of elements: ");
scanf("%d", &num);
ptr = (int*) calloc(num, sizeof(int)); //calloc ব্যবহার করে মেমোরি বরাদ্দ করা
if(ptr == NULL)
{
printf("Error! memory not allocated.");
exit(0);
}
printf("Enter elements of array: ");
for(i = 0; i < num; ++i)
{
scanf("%d", ptr + i);
sum += *(ptr + i);
}
printf("Sum = %d", sum);
free(ptr);
return 0;
}
ইতিমধ্যে বরাদ্দকৃত মেমোরির সাইজ যদি প্রয়োজনের তুলনায় কম বা বেশি হয় তাহলে realloc() ফাংশন ব্যবহার করে আপনি পূর্ববর্তী মেমোরির সাইজ পরিবর্তন করতে পারেন।
ptr = realloc(ptr, newsize);
এখানে ptr হলো নতুন সাইজের বরাদ্দ হওয়া মেমোরি।
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *ptr, i , n1, n2;
printf("Enter size of array: ");
scanf("%d", &n1);
ptr = (int*) malloc(n1 * sizeof(int));
printf("Address of previously allocated memory: ");
for(i = 0; i < n1; ++i)
printf("%u\t",ptr + i);
printf("\nEnter new size of array: ");
scanf("%d", &n2);
ptr = realloc(ptr, n2);
for(i = 0; i < n2; ++i)
printf("%u\t", ptr + i);
return 0;
}
common.read_more